// src/utils/storage.ts
import CryptoJS from "crypto-js";

const CRYPTO_KEY =
  import.meta.env.VITE_STORAGE_KEY ||
  "Jcs14tyocSnlyuaIA9+ieWxPq8hTcQNguXA/cRxvWkI=";

interface StorageOptions {
  expiresInHours?: number; // 可选过期时间（小时）
}

/**
 * 通用加密存储工具
 * 示例：
 *   storage.set('accessToken', 'xxx', { expiresInHours: 2 })
 *   storage.get('userInfo') // 自动推断类型
 */
export const storage = {
  /**
   * 加密存储数据
   * @param key 存储键名
   * @param value 存储值（自动 JSON 序列化）
   * @param options 配置项
   */
  set<T>(key: string, value: T, options: StorageOptions = {}): void {
    const data = {
      value,
      expiresAt: options.expiresInHours
        ? Date.now() + options.expiresInHours * 60 * 60 * 1000
        : undefined,
    };
    const encrypted = CryptoJS.AES.encrypt(
      JSON.stringify(data),
      CRYPTO_KEY
    ).toString();
    // console.log("encrypted:", encrypted);
    localStorage.setItem(key, encrypted);
  },

  /**
   * 解密读取数据
   * @param key 存储键名
   * @returns 数据（自动反序列化）或 null
   */
  get<T>(key: string): T | null {
    const encrypted = localStorage.getItem(key);
    if (!encrypted) return null;

    try {
      const bytes = CryptoJS.AES.decrypt(encrypted, CRYPTO_KEY);
      const data = JSON.parse(bytes.toString(CryptoJS.enc.Utf8)) as {
        value: T;
        expiresAt?: number;
      };

      // 检查过期
      if (data.expiresAt && Date.now() > data.expiresAt) {
        this.remove(key);
        return null;
      }

      return data.value;
    } catch {
      this.remove(key);
      return null;
    }
  },

  /**
   * 判断缓存是否存在
   */
  has(key: string): boolean {
    const encrypted = localStorage.getItem(key);
    if (!encrypted) return false;

    try {
      const bytes = CryptoJS.AES.decrypt(encrypted, CRYPTO_KEY);
      const data = JSON.parse(bytes.toString(CryptoJS.enc.Utf8)) as {
        value: any;
        expiresAt?: number;
      };

      // 检查是否过期
      if (data.expiresAt && Date.now() > data.expiresAt) {
        this.remove(key); // 自动移除过期项
        return false;
      }

      return true;
    } catch {
      this.remove(key); // 解析失败时移除无效数据
      return false;
    }
  },
  /**
   * 移除指定数据
   */
  remove(key: string): void {
    localStorage.removeItem(key);
  },

  /**
   * 清空所有本系统相关的存储
   */
  clear(): void {
    localStorage.clear();
    // 可根据实际需求遍历删除特定前缀的 key
    Object.keys(localStorage).forEach((key) => {
      if (key.startsWith("admin_")) {
        // 示例前缀
        localStorage.removeItem(key);
      }
    });
  },
};
